home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / TurboTCP 1.0.1 / MiniTelnet.source / CTelnetSettingsDLOG.cp < prev    next >
Text File  |  1993-12-10  |  9KB  |  436 lines

  1. /*
  2. ** CTelnetSettingsDLOG.cp
  3. **
  4. **    MiniTelnet application
  5. **    Telnet settings dialog director
  6. **
  7. **    Copyright © 1993, FrostByte Design / Eric Scouten
  8. **
  9. */
  10.  
  11.  
  12. #include "CTelnetSettingsDLOG.h"
  13.  
  14. #ifndef TurboTCPHeaders
  15.     #include <Commands.h>
  16.     #include <TCLUtilities.h>
  17.     #include <TBUtilities.h>
  18.     #include <CApplication.h>
  19.     #include <CBartender.h>
  20.     #include <CDialog.h>
  21.     #include <CButton.h>
  22.     #include <CCheckBox.h>
  23.     #include <CEditText.h>
  24.     #include <cast.h>
  25.     #include "CDisposerChore.h"
  26. #endif
  27.  
  28. #include <CDataFile.h>
  29. #include <CPaneBorder.h>
  30. #include <CRadioGroupPane.h>
  31.  
  32. #include "CMiniTelnetApp.h"
  33. #include "CTelnetTerminal.h"
  34.  
  35.  
  36. // item numbers in dialog box
  37.  
  38. #define itemOK            1
  39. #define itemCancel        2
  40. #define itemSave        3
  41. #define itemHostName    4
  42. #define itemBSPane        6
  43. #define itemBS_BS        7
  44. #define itemBS_DEL        8
  45. #define itemGoAway        9
  46. #define itemTitle        10
  47. #define itemShowDebug    14
  48.  
  49. extern CApplication    *gApplication;
  50. extern CBartender    *gBartender;
  51. extern OSType        gSignature;
  52.  
  53.  
  54. //    —— initialization ——
  55.  
  56. /*______________________________________________________________________
  57. **
  58. ** ITelnetSettingsDLOG
  59. **
  60. **    Initialize the settings dialog.
  61. **
  62. **        aSupervisor (CDirectorOwner *):    the supervisor for the dialog
  63. **
  64. */
  65.  
  66. void CTelnetSettingsDLOG::ITelnetSettingsDLOG (CDirectorOwner *aSupervisor)
  67.  
  68. {
  69.     CButton        *theButton;
  70.     CPane        *thePane;
  71.     CPaneBorder    *theBorder;
  72.  
  73.  
  74.     // set up the dialog box
  75.  
  76.     CDLOGDirector::IDLOGDirector(DLOGSettings, aSupervisor);
  77.  
  78.  
  79.     // find important buttons & configure them
  80.  
  81.     theButton = CheckedCast(itsWindow->FindViewByID(itemOK), CButton);
  82.     if (theButton) {
  83.         theButton->SetClickCmd(cmdOK);
  84.         ((CDialog *) itsWindow)->SetDefaultButton(theButton);
  85.     }
  86.  
  87.     theButton = CheckedCast(itsWindow->FindViewByID(itemCancel), CButton);
  88.     if (theButton)
  89.         theButton->SetClickCmd(cmdCancel);
  90.  
  91.     theButton = CheckedCast(itsWindow->FindViewByID(itemSave), CButton);
  92.     if (theButton)
  93.         theButton->SetClickCmd(cmdSaveSettings);
  94.  
  95.  
  96.     // add a border for the dialog title
  97.  
  98.     thePane = CheckedCast(itsWindow->FindViewByID(itemTitle), CPane);
  99.     if (thePane) {
  100.         theBorder = new(CPaneBorder);
  101.         if (theBorder) {
  102.             theBorder->IPaneBorder(kBorderBottom);
  103.             thePane->SetBorder(theBorder);
  104.         }
  105.     }
  106.  
  107.  
  108.     // get rid of that ugly border around the radio buttons
  109.  
  110.     thePane = CheckedCast(itsWindow->FindViewByID(itemBSPane), CPane);
  111.     if (thePane) {
  112.         theBorder = thePane->GetBorder();
  113.         if (theBorder)
  114.             theBorder->SetBorderFlags(kBorderNone);
  115.     }
  116.     
  117. }
  118.  
  119.  
  120. //    —— settings record functions ——
  121.  
  122. /*______________________________________________________________________
  123. **
  124. ** DefaultSettings
  125. **
  126. **    Creates a new blank settings record and copies this to the dialog.
  127. **
  128. */
  129.  
  130. void CTelnetSettingsDLOG::DefaultSettings (void)
  131.  
  132. {
  133.     r.signature = kTSRsignature;
  134.     r.settingsVersion = kTSRversion;
  135.     r.settingsMinVersion = 0;
  136.     r.hostName[0] = '\0';
  137.     BlockMove(&"UNKNOWN", &r.termEmulation, 8);
  138. //    r.backspaceChar = charBS;
  139.     r.backspaceChar = charDEL;
  140.     r.closeOnSessionEnd = FALSE;
  141.     r.showDebug = FALSE;
  142.     
  143.     PutSettings();
  144. }
  145.  
  146.  
  147. /*______________________________________________________________________
  148. **
  149. ** GrabSettings
  150. **
  151. **    Get the settings from the dialog box fields and put them into the
  152. **    settings record.
  153. **
  154. */
  155.  
  156. void CTelnetSettingsDLOG::GrabSettings (void)
  157.  
  158. {
  159.     CCheckBox        *theCheckBox;
  160.     CEditText            *theText;
  161.     CRadioGroupPane    *theRadios;
  162.     short              textSize;
  163.     short            i;
  164.     char                *p;
  165.  
  166.  
  167.     // blank out the settings record
  168.     
  169.     p = (char *) &r;
  170.     for (i=0; i<sizeof(TelnetSettingsRec); i++)
  171.         *p++ = '\0';
  172.  
  173.  
  174.     // recreate signature, version info
  175.  
  176.     r.signature = kTSRsignature;
  177.     r.settingsVersion = kTSRversion;
  178.     r.settingsMinVersion = 0;
  179.  
  180.  
  181.     // get host name
  182.  
  183.     theText = CheckedCast(itsWindow->FindViewByID(itemHostName), CEditText);
  184.     if (theText) {
  185.         textSize = theText->GetLength();
  186.         textSize = textSize > 255 ? 255 : textSize;
  187.         BlockMove(*(theText->GetTextHandle()), &r.hostName, textSize);
  188.         r.hostName[textSize] = '\0';
  189.     }
  190.  
  191.  
  192.     // get terminal emulation
  193.  
  194.     BlockMove(&"UNKNOWN", &r.termEmulation, 8);
  195.  
  196.  
  197.     // get backspace/del configuration
  198.  
  199.     theRadios = CheckedCast(itsWindow->FindViewByID(itemBSPane), CRadioGroupPane);
  200.     if (theRadios)
  201.         r.backspaceChar = (theRadios->GetStationID() == itemBS_DEL ? charDEL : charBS);
  202.  
  203.  
  204.     // get window go away config
  205.  
  206.     theCheckBox = CheckedCast(itsWindow->FindViewByID(itemGoAway), CCheckBox);
  207.     if (theCheckBox)
  208.         r.closeOnSessionEnd = theCheckBox->IsChecked();
  209.  
  210.  
  211.     // get show debug codes config
  212.  
  213.     theCheckBox = CheckedCast(itsWindow->FindViewByID(itemShowDebug), CCheckBox);
  214.     if (theCheckBox)
  215.         r.showDebug = theCheckBox->IsChecked();
  216.  
  217. }
  218.  
  219.  
  220. /*______________________________________________________________________
  221. **
  222. ** PutSettings
  223. **
  224. **    Copy the settings from the settings record to the dialog box fields.
  225. **
  226. */
  227.  
  228. void CTelnetSettingsDLOG::PutSettings (void)
  229.  
  230. {
  231.     CCheckBox        *theCheckBox;
  232.     CEditText            *theText;
  233.     CPane            *thePane;
  234.     CRadioGroupPane    *theRadios;
  235.  
  236.  
  237.     // get host name
  238.  
  239.     theText = CheckedCast(itsWindow->FindViewByID(itemHostName), CEditText);
  240.     if (theText)
  241.         theText->SetTextPtr((char *) &r.hostName, cstrlen(r.hostName));
  242.  
  243.  
  244.     // get backspace/del configuration
  245.  
  246.     theRadios = CheckedCast(itsWindow->FindViewByID(itemBSPane), CRadioGroupPane);
  247.     if (theRadios)
  248.         theRadios->SetStationID((r.backspaceChar == charDEL) ? itemBS_DEL : itemBS_BS);
  249.  
  250.  
  251.     // get window go away config
  252.  
  253.     theCheckBox = CheckedCast(itsWindow->FindViewByID(itemGoAway), CCheckBox);
  254.     if (theCheckBox)
  255.         theCheckBox->SetValue(r.closeOnSessionEnd);
  256.  
  257.  
  258.     // get show debug codes config
  259.  
  260.     theCheckBox = CheckedCast(itsWindow->FindViewByID(itemShowDebug), CCheckBox);
  261.     if (theCheckBox)
  262.         theCheckBox->SetValue(r.showDebug);
  263.  
  264.  
  265.     // ignore other parms
  266.  
  267.     // force redraw
  268.  
  269.     thePane = CheckedCast(itsWindow, CPane);
  270.     if (thePane)
  271.         thePane->Refresh();
  272.  
  273. }
  274.  
  275.  
  276. //    —— dialog handling functions ——
  277.  
  278. /*______________________________________________________________________
  279. **
  280. ** DoCommand
  281. **
  282. **    Handle all commands that the dialog can understand.
  283. **
  284. **        theCommand (long):    the command number which was issued
  285. **
  286. */
  287.  
  288. void CTelnetSettingsDLOG::DoCommand (long theCommand)
  289.  
  290. {
  291.     CButton            *cancelBtn;
  292.     TelnetSettingsRec    rTemp;
  293.  
  294.  
  295.     // what command did we get?
  296.  
  297.     switch (theCommand) {
  298.  
  299.  
  300.         // OK, Cancel buttons: respond
  301.  
  302.         case cmdOK:
  303.             if (EndDialog(cmdOK, TRUE)) {
  304.                 GrabSettings();
  305.                 BlockMove(&r, &rTemp, sizeof(TelnetSettingsRec));
  306.                 if (CheckedCast(gApplication, CMiniTelnetApp))
  307.                     ((CMiniTelnetApp *) gApplication)->NewSession(&rTemp);
  308.             }
  309.             break;
  310.             
  311.         case cmdCancel:
  312.             EndDialog(cmdCancel, FALSE);
  313.             break;
  314.  
  315.  
  316.         // Save Settings: do it
  317.  
  318.         case cmdSave:
  319.         case cmdSaveAs:
  320.         case cmdSaveSettings:
  321.             GrabSettings();
  322.             DoSaveFile();
  323.             break;
  324.  
  325.  
  326.         // File->Close: cancel out of here
  327.  
  328.         case cmdClose:        
  329.             cancelBtn = ((CDialog *) itsWindow)->FindButton(cmdCancel);
  330.             if (cancelBtn)
  331.                 cancelBtn->SimulateClick();
  332.             EndDialog(cmdCancel, FALSE);
  333.             break;
  334.  
  335.  
  336.         // not ours, send along the chain
  337.  
  338.         default:
  339.             CDialogDirector::DoCommand(theCommand);
  340.     }
  341.  
  342.  
  343.     // if closing window, use a disposer chore
  344.  
  345.     if ((dismissCmd != cmdNull) && (theCommand != cmdClose))
  346.         disposeViaUrgentChore(this);
  347.  
  348. }
  349.  
  350.  
  351. /*______________________________________________________________________
  352. **
  353. ** UpdateMenus
  354. **
  355. **    Enable Telnet-specific commands.
  356. **
  357. */
  358.  
  359. void CTelnetSettingsDLOG::UpdateMenus (void)
  360.  
  361. {
  362.     CDLOGDirector::UpdateMenus();
  363.     gBartender->EnableCmd(cmdSave);
  364.     gBartender->EnableCmd(cmdSaveAs);
  365. }
  366.  
  367.  
  368. //    —— file interactions ——
  369.  
  370. /*______________________________________________________________________
  371. **
  372. ** DoSaveFile
  373. **
  374. **    Save a settings record to a file.
  375. **
  376. */
  377.  
  378. void CTelnetSettingsDLOG::DoSaveFile (void)
  379.  
  380. {
  381.     Point            corner;                // top left corner of dialog box
  382.     Str255        origName;                // default name for file
  383.     short        nameLength;            // length of default name
  384.     StringHandle    prompt;                // prompt string
  385.     Boolean        wasLocked;
  386.     
  387.     CDataFile        *itsFile;                // don’t keep the file around
  388.     SFReply        macSFReply;            // reply from Std File
  389.  
  390.  
  391.     // ask user for settings file name
  392.  
  393.     FindDlogPosition('DLOG', putDlgID, &corner);
  394.     BlockMove(&r.hostName, &origName[1], 31);
  395.     nameLength = cstrlen(r.hostName);
  396.     origName[0] = (nameLength > 31 ? 31 : nameLength);
  397.     
  398.     prompt = GetString(STR_SettingsPrompt);
  399.     FailNILRes(prompt);
  400.     
  401.     MoveHHi((Handle) prompt);
  402.     HLock((Handle) prompt);
  403.     SFPPutFile(corner, *prompt, origName, NULL, &macSFReply, putDlgID, NULL);
  404.     ReleaseResource((Handle) prompt);
  405.  
  406.  
  407.     // create the file
  408.  
  409.     TRY {
  410.         itsFile = new(CDataFile);
  411.         itsFile->IDataFile();
  412.         itsFile->SFSpecify(&macSFReply);
  413.  
  414.         if (itsFile->ExistsOnDisk()) {
  415.             itsFile->Open(fsRdWrPerm);
  416.             itsFile->SetLength(0);
  417.                 // TEMPORARY: need to reset file type
  418.         }
  419.         else {
  420.             itsFile->CreateNew(gSignature, kSettingsFileType);
  421.             itsFile->Open(fsRdWrPerm);
  422.         }
  423.         wasLocked = Lock(TRUE);
  424.         itsFile->WriteSome((Ptr) &r, sizeof(TelnetSettingsRec));
  425.         Lock(wasLocked);
  426.         itsFile->Close();
  427.         itsFile->Dispose();
  428.     }
  429.     
  430.     CATCH {
  431.         ForgetObject(itsFile);
  432.     }
  433.     ENDTRY;
  434.  
  435. }
  436.